---
title: Генератор паролей
description: Пишем программу на JavaScript для формирования случайных 20-значных комбинаций из латинских букв, цифр и спецсимволов. На выбор 60 вариантов — 4 столбца по...
sections: [Криптография,Случайные комбинации]
tags: [javascript,онлайн,текст,символы,буквы,цифры,знаки,комбинации]
scripts: [/js/password-generator.js]
styles: [/css/pomodoro5.css]
canonical_url: /ru/2023/06/19/password-generator.html
url_translated: /en/2023/06/20/password-generator.html
title_translated: Password generator
date: 2023.06.19
---

Пишем программу на JavaScript для формирования случайных 20-значных комбинаций из латинских букв, цифр и
спецсимволов. На выбор 60 вариантов — 4 столбца по 15 строк. Первый символ — всегда буква, все символы в
каждой комбинации идут без повторов. Будем формировать пароли для вёб-сайтов в браузере.

<div>
<input type="button" value="Обновить" title="Обновить комбинации" onclick="refresh()">
</div>

<div class="highlight">
<pre class="highlight">
<code id="combinations"></code>
</pre>
</div>

Используем символы в диапазоне от `!` до `~` и их десятичные коды от `33` до `126`.

{% capture collapsed_md %}
```
!  "  #  $  %  &  '  (  )  *  +  ,  -  .  /  0  1  2  3  4  5  6  7  8  9  :  
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 

;  <  =  >  ?  @  A  B  C  D  E  F  G  H  I  J  K  L  M  N  O  P  Q  R  S  T  
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 

U  V  W  X  Y  Z  [  \  ]  ^  _  `  a  b  c  d   e   f   g   h   i   j   k   
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 

l   m   n   o   p   q   r   s   t   u   v   w   x   y   z   {   |   }   ~   
108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 
```
{% endcapture %}
{%- include collapsed_block.html summary="Таблица символов" content=collapsed_md -%}

Три вложенных цикла: по строкам, по колонкам и по комбинациям. Получаем случайное число — код символа в
диапазоне `[33-126]`, затем проверяем на соответствие условиям и добавляем в комбинацию. Первый символ
— буква, все символы в каждой комбинации идут без повторов. Экранируем символы `&`, `>` и `<` для
корректного отображения в браузере. Собираем 15 строк, в каждой строке по 4 комбинации.

```js
'use strict';
// формирование комбинаций
const generate = function() {
  let text = "";
  for (let row = 0; row < 15; row++) {
    let line = "";
    for (let col = 0; col < 4; col++) {
      let combo = "";
      for (let len = 0; len < 20; len = combo.length) {
        const co = random("!".charCodeAt(0), "~".charCodeAt(0));
        const ch = String.fromCharCode(co);
        if (len == 0 && (ch >= "A" && ch <= "Z" || ch >= "a" && ch <= "z")
            || len > 0 && combo.indexOf(ch) < 0)
          combo += ch;
      }
      line += escapeHTML(combo) + "  ";
    }
    text += line + (row < 14 ? "\n" : "");
  }
  return text;
}
```
```js
// получение случайного числа в заданном диапазоне
const random = (min, max) => Math.round(min + (max-min) * Math.random());
// экранирование спецсимволов HTML для корректного отображения в браузере
const escapeHTML = (str) => str.replace("&", "&amp;").replace(">", "&gt;").replace("<", "&lt;");
// кнопка обновить на странице — обновляем комбинации
const refresh = () => document.getElementById("combinations").innerHTML = generate();
// после загрузки всех частей страницы — обновляем комбинации
document.addEventListener("DOMContentLoaded", refresh);
```

Давно пользуюсь этим алгоритмом — у меня все пароли для вёб-сайтов по этой схеме сгенерированы,
поэтому рекомендую. Первая версия была написана на Java, но для вёб-сайтов проще получается на
JavaScript, чтобы далеко не ходить.
